PV、PVC及StorageClass

简要认识及区分PV、PVC及StorageClass。

基本概念

PV

PV是集群内网络存储的volume插件,但是生命周期Pod相互独立。PV封装了存储系统的实现细节。

PVC

PVC是用户的存储请求,和Pod类似,Pod消耗Node资源,而PVC消耗PV资源。PVC请求指定大小和访问模式。

StorageClass

StorageClass描述存储的等级,将不同的等级映射到不同的服务等级、不同的后端策略。

生命周期

PV和PVC的相互作用生命周期大致遵循Provisioning->Binding->Using->Releasing->Recycling。

Provisioning

PV有两种提供方式:静态和动态。

静态PV

静态PV带有真实存储的详细信息。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv01
labels:
app: "mypvtest"
spec:
capacity:
storage: 100Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Recycle
nfs:
server: mynfs.example.com
path: "/data"

动态

当用户定义的PVC匹配不到任何静态PV时,集群会尝试基于StorageClass专门地提供volume给PVC:PVC请求一个已配置过的StorageClass,设置存储插件等参数,用于提供不同的存储卷。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
kind: StorageClass
apiVersion: storage.k8s.io/v1beta1
metadata:
name: slow
provisioner: kubernetes.io/gce-pd
parameters:
type: pd-standard

kind: StorageClass
apiVersion: storage.k8s.io/v1beta1
metadata:
name: fast
provisioner: kubernetes.io/gce-pd
parameters:
type: pd-ssd

Binding

  1. 每当Master监听到新的PVC, 查找匹配的PV,并将PVC和PV绑定。
  2. 如果一个PV曾动态绑定给了一个PVC,那么会一直绑定这对PV和PVC。
  3. 如果没有为PVC找到匹配的PV,且PVC没有指定StorageClass,那么PVC会无限期处于unbound状态,一旦有PV可用了,PVC就又变为bound状态。
  4. 当PVC指定了StorageClass,在创建PVC时,集群会自动根据StorageClass的定义创建一个PV,并绑定到PVC,从而不再需要提前手动创建PV。

如下通过指定volumeName及selector来选定上述名为pv01的PV。

1
2
3
4
5
6
7
8
9
10
11
12
13
apiVersion: v1
metadata:
name: pvc01
spec:
accessModes:
- ReadWriteOnce
volumeName: pv01
resources:
requests:
storage: 100Gi
selector:
matchLabels:
app: "mypvtest"

如下通过StorageClass动态创建PV并绑定。

1
2
3
4
5
6
7
8
9
10
11
12
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: pvc02
namespace:
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 100Gi
storageClassName: fast

Using

Pod使用PVC就像使用volume一样。集群检查PVC,查找绑定的PV,并映射PV给Pod。对于支持多种访问模式的PV,用户可以指定想用的模式。
一旦用户拥有了一个PVC,并且PVC处于bound状态,那么只要用户还需要,PV就一直属于该用户。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
kind: Pod
apiVersion: v1
metadata:
name: pod01
spec:
volumes:
- name: storage01
persistentVolumeClaim:
claimName: pvc01
containers:
- name: container01
image: tomcat:8
ports:
- containerPort: 80
name: "app"
volumeMounts:
- mountPath: "/var/lib/tomcat"
name: storage01

Releasing

当用户使用PV完毕,PVC被删除后,对应的PV进入released状态,但还不能立即被另一个PVC使用。前一个PVC的数据还存在于该PV中,必须根据策略来处理掉。

Recycling

PV的回收策略定义了PV被释放之后集群如何处理该PV,PV可以被Retained(保留)、 Recycled(再利用)或Deleted(删除)。